# 1、导入模块
import time
from selenium import webdriver
from selenium.webdriver.firefox.service import Service
from selenium.webdriver.common.by import By

# 2、实例化浏览器对象
driver_path = "C:/Users/Lenovo/AppData/Local/Programs/Python/Python310/geckodriver.exe"
service = Service(executable_path=driver_path)
driver = webdriver.Firefox(service=service)

# 3、打开网页：在浏览器打开html文件后，复制网址信息
driver.get("file:///E:/project/learn-python/html%E5%9F%BA%E7%A1%80/3-%E8%A1%A8%E5%8D%95%E6%8F%90%E4%BA%A4.html")

# 需求：打开html文件，完成以下操作：
# 需求1 - id 定位
'''
# 11 使用id定位，输入用户名：admin-1
username = driver.find_element(By.ID, "user")
username.send_keys("admin-1")
# 12 使用id定位，输入密码：123456
password = driver.find_element(By.ID, "pwd")
password.send_keys("123456")
'''
# 需求2 - name 定位
'''
# 11 使用name定位，输入用户名：admin-2
username = driver.find_element(By.NAME, "username")
username.send_keys("admin-2")
# 12 使用name定位，输入密码：234567
password = driver.find_element(By.NAME, "password")
password.send_keys("234567")
'''
# 需求3 - class_name 定位
'''
# 11 使用class_name定位电话号码A，并输入：18611111111
username = driver.find_element(By.CLASS_NAME, "tell")
username.send_keys("18611111111")
# 12 使用class_name定位电子邮箱A，并输入：123@qq.com
password = driver.find_element(By.CLASS_NAME, "email")
password.send_keys("123@qq.com")
'''
# 需求4 - tag_name 定位
'''
# 使用tag_name定位用户名输入框，并输入：admin-4
username = driver.find_element(By.TAG_NAME, "input")       # 等价于: driver.find_element(By.TAG_NAME, "input").send_keys("admin-4")
username.send_keys("admin-4")
'''
# 需求5 - link_text 定位
'''
# 使用link_text定位(访问新浪网址)超链接，并点击
driver.find_element(By.LINK_TEXT, "访问 新浪 网址").click()
'''
# 需求6 - partial_link_text 定位
'''
# 使用partial_link_text定位(访问新浪网址)超链接，并点击
driver.find_element(By.PARTIAL_LINK_TEXT, "访问").click()
'''
# 需求7 - 定位一组与元素
'''
# 使用name定位用户地址，并输入：云南、西藏
elements = driver.find_elements(By.NAME, "addr")
print(type(elements))    # list类型
elements[0].send_keys("云南")
elements[1].send_keys("西藏")
'''
# 需求8.1 -  Xpath（路径）定位
'''
# 11 使用 绝对路径 定位用户名输入框，并输入：admin-8.1
element = driver.find_element(By.XPATH, "/html/body/form/input")
element.send_keys("admin-8.1")
time.sleep(3)
# 12 使用 相对路径 定位密码输入框，并输入：654321
element = driver.find_element(By.XPATH, '//*[@id="pwd"]')
element.send_keys("654321")
'''
# 需求8.2 -  Xpath（利用元素属性）定位
'''
# 语法1：使用元素属性信息定位用户名输入框，并输入：admin-8.2
element = driver.find_element(By.XPATH, '//input[@placeholder="请输入用户名"]')
element.send_keys('admin-8.2')
time.sleep(2)
# 语法2：使用元素属性信息定位密码输入框，并输入：123456
element = driver.find_element(By.XPATH, '//*[@name="password"]')
element.send_keys('123456')
'''
# 需求8.3 - Xpath（属性与逻辑结合）定位
'''
# 使用属性与逻辑结合定位策略，在test1对应的输入框中，输入：admin-8.3
element =driver.find_element(By.XPATH, '//*[@class="login" and @name="user"]')
element.send_keys('admin-8.3')
'''
# 需求8.4 - Xpath（层级与属性结合）定位
'''
# 8.41-使用层级与属性结合定位策略，在test1对应的输入框中，输入：admin-8.4
element = driver.find_element(By.XPATH, '//*[@id="p1"]/input')
element.send_keys('admin-8.41')
# 8.42-祖辈和后代关系：定位test2对应的输入框，并输入：123456
element = driver.find_element(By.XPATH, '//form//*[@id="p2"]//input')
element.send_keys("123456")
'''
# 需求8.5 - Xpath（文本内容是xxx的元素）定位
'''
# 访问当前窗口2的新浪网址超链接，并点击
driver.find_element(By.XPATH, '//*[text()="访问 新浪 网址"]').click()
'''
# 需求8.6 - Xpath（属性中包含xxx的元素）定位
'''
# 定位用户电子邮箱的输入框，并输入：123@qq.com
element = driver.find_element(By.XPATH, '//*[contains(@class,"ail")]')
element.send_keys("123@qq.com")
'''
# 需求8.7 - Xpath（属性以xxx开头的元素）定位
'''
# 定位用户名的输入框，并输入：admin-8.7
element = driver.find_element(By.XPATH, '//*[starts-with(@name, "use")]')
element.send_keys("admin-8.7")
'''
# 需求9.1 - CSS（id 选择器）定位
'''
# 定位用户名输入框，并输入：admin-9.1
element = driver.find_element(By.CSS_SELECTOR, '#user')
element.send_keys('admin-9.1')
'''
# 需求9.2 - CSS（class 选择器）定位
'''
# 定位电子邮箱输入框，并输入：123@qq.com
element = driver.find_element(By.CSS_SELECTOR, '.email')
element.send_keys('123@qq.com')
'''
# 需求9.3 - CSS（元素 选择器）定位
'''
# 定位注册按钮，并点击
driver.find_element(By.CSS_SELECTOR, 'button').click()
'''
# 需求9.4 - CSS（属性 选择器）定位
'''
# 语法1：定位用户名输入框，并输入：admin-9.4
element = driver.find_element(By.CSS_SELECTOR, '[placeholder="请输入用户名"]')
element.send_keys('admin-9.4')
# 语法2：定位密码输入框，并输入：123456
element = driver.find_element(By.CSS_SELECTOR, 'input[placeholder="请输入密码"]')
element.send_keys('123456')
'''
# 需求9.5 - CSS（层级 选择器）定位
''''
# 语法1-写法1：（父子层级）定位test1对应的输入框，并输入：admin-9.5
element = driver.find_element(By.CSS_SELECTOR, '#p1>input')
element.send_keys("admin-9.5")
# 语法1-写法2：（父子层级）定位test2对应的输入框，并输入：18600000000
element = driver.find_element(By.CSS_SELECTOR, 'p[id="p2"]>input')
element.send_keys('18600000000')
# 语法2-层级1：（父子层级）定位test3对应的输入框，并输入：123@qq.com
element = driver.find_element(By.CSS_SELECTOR, '#p3 input')
element.send_keys("123@qq.com")
# 语法2-层级2：（祖辈层级）定位密码输入框，并输入：123456
element = driver.find_element(By.CSS_SELECTOR, 'form [placeholder="请输入密码"]')
element.send_keys('123456')
'''
# 需求10 - CSS延伸
# 10.1-以xxx开头
# 定位用户名输入框，并输入：admin-10.1
'''
element = driver.find_element(By.CSS_SELECTOR, 'input[name^="use"]')
element.send_keys("admin-10.1")
# 10.2-以xxx结尾
# 定位密码输入框，并输入：123456
element = driver.find_element(By.CSS_SELECTOR, 'input[type$="ord"]')
element.send_keys("123456")
# 10.3 - 包含xxx
# 定位电子邮箱输入框，并输入：123@qq.com
element = driver.find_element(By.CSS_SELECTOR, 'input[class*="mai"]')
element.send_keys("123@qq.com")
'''

# 4、展示效果
time.sleep(3)

# 5、关闭页面
# driver.quit()
